/**
 * 
 */
package pruebas.tiendaOl.riuCliente;

import java.io.Serializable;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.annotation.PostConstruct;
import javax.enterprise.context.Conversation;
import javax.enterprise.context.ConversationScoped;
import javax.enterprise.event.Observes;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.inject.Named;

import pruebas.tiendaOl.ipsWeb.IpsGondola;
import pruebas.tiendaOl.ipsWeb.IpsGondola.EventoCambiosGondola;
import pruebas.tiendaOl.ipsWeb.IpsGondola.IpsItemGondola;

import com.intelap.jsfLib.ayudaDaosJava.AyudaDaoBusqueda_Java;
import com.intelap.jsfLib.decoracion.DaoBusqueda;
import com.intelap.jsfLib.decoracion.DciBuscador;
import com.intelap.jsfLib.decoracion.DciCampo.DcaCampo;
import com.intelap.pureFabrications.AccesoPropMutableObservable;
import com.intelap.pureFabrications.AccesoPropMutableObservable.AccesoPropMutableObservableImpl;

/** RIU (Respaldo interfaz usuario) de la vista de Gondola
 * @author ggpollit */
@Named
@ConversationScoped
public class RiuGondola implements Serializable {
	@Inject
	private Logger logger;
	@Inject
	private Conversation conversacion;
	@SuppressWarnings("cdi-ambiguous-dependency")
	@Inject
	private IpsGondola ipsGondola;

	@PostConstruct
	void postConstruct() {
		if (this.conversacion.isTransient())
			this.conversacion.begin();
		logger.info("postConstruct de RiuGondola#" + System.identityHashCode(this) + " asociada a conversacion#" + conversacion.getId());
	}

	//// observación de cambios en el dominio /////

	void contenidoGondolaHaCambiado(@Observes EventoCambiosGondola evento) {
		accesoTipoArticuloElegido.setValor(null);
		getMdcBuscadorTipoArticulo().datosAsistenciaHanCambiado();
	}


	//// navegador de articulos ////

	private MdcBuscadorTipoArticulo mdcBuscadorTipoArticulo = null;
	public MdcBuscadorTipoArticulo getMdcBuscadorTipoArticulo() {
		if (this.mdcBuscadorTipoArticulo == null) {
			this.mdcBuscadorTipoArticulo = new MdcBuscadorTipoArticulo(this.accesoTipoArticuloElegido);
		}
		return this.mdcBuscadorTipoArticulo;
	}

	private final AccesoPropMutableObservable<IpsItemGondola> accesoTipoArticuloElegido = new AccesoPropMutableObservableImpl<IpsItemGondola>(
			null);
	private class MdcBuscadorTipoArticulo extends DciBuscador.MdcBuscadorPi<IpsItemGondola, ItemGondolaAdaptado> {
		public MdcBuscadorTipoArticulo(AccesoPropMutableObservable<IpsItemGondola> acceso) {
			super(acceso, null);
		}

		@Override
		public String getEncabezadoTabla() {
			return "Gondola";
		}

		@Override
		protected Class<ItemGondolaAdaptado> getTipoElemsAdaptados() {
			return ItemGondolaAdaptado.class;
		}

		@Override
		protected IpsItemGondola getRespaldo(ItemGondolaAdaptado elementoAdaptado) {
			return elementoAdaptado.respaldo;
		}

		@Override
		protected DaoBusqueda<ItemGondolaAdaptado> getDaoBusqueda() {
			return this.daoBusquedaTipoArticulo;
		}

		private final DaoBusqueda<ItemGondolaAdaptado> daoBusquedaTipoArticulo = new AyudaDaoBusqueda_Java<IpsItemGondola, ItemGondolaAdaptado>() {
			@Override
			protected List<? extends IpsItemGondola> getElementos() {
				return ipsGondola.getItems();
			}

			@Override
			protected Class<ItemGondolaAdaptado> getTipoElems() {
				return MdcBuscadorTipoArticulo.this.getTipoElemsAdaptados();
			}

			@Override
			protected ItemGondolaAdaptado adaptar(IpsItemGondola elementoGenuino) {
				return new ItemGondolaAdaptado(elementoGenuino);
			}
		};
	}

	public static class ItemGondolaAdaptado {
		final IpsItemGondola respaldo;
		ItemGondolaAdaptado(IpsItemGondola respaldo) {
			this.respaldo = respaldo;
		}

		@DcaCampo(etiqueta = "Tipo artítulo", pesoUbicacion = 10)
		public String getNombre() {
			return respaldo.getNombre();
		}
		@DcaCampo
		public int getCantidad() {
			return respaldo.getCantidad();
		}
	}


	//// manejo de acciones del usuario ////

	public String botonCargarHaSidoPresionado() {
		IpsItemGondola itemGondolaElegido = this.accesoTipoArticuloElegido.getValor();
		if (itemGondolaElegido == null) {
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Antes debe elegir un artículo"));
		} else
			try {
				this.ipsGondola.ponerArticulosEnCarrito(itemGondolaElegido, 1);
			} catch (Exception e) {
				logger.log(Level.INFO, "Excepcion al intentar poner articulo en carrito: ", e);
				FacesContext.getCurrentInstance().addMessage(null,
						new FacesMessage("No se ha podido agregar el articulo debido a un error del sistema", e.getMessage()));
				if (!conversacion.isTransient())
					conversacion.end();
				return "error";
			}
		return null;
	}

	public String getOutcomeBotonIrACarrito() {
		return "carrito?cid=" + this.conversacion.getId();
	}
}
